package contable.dominio;

/**
 *
 * @author suncin
 */
public class Cuenta {

    private String codigo;
    private String nombre;
    private double debe = 0.00;
    private double haber = 0.00;
    private int rubro;
    /**
     * Rubro: Activo
     */
    public static final int ACTIVO = 100;
    /**
     * Rubro: Activo disponible
     */
    public static final int ACTIVO_DISPONIBLE = 110;
    /**
     * Rubro: Activo realizable
     */
    public static final int ACTIVO_REALIZABLE = 120;
    /**
     * Rubro: Activo realizable inventarios
     */
    public static final int ACTIVO_REALIZABLE_INVENTARIO = 121;
    /**
     * Rubro: Activo realizable papelería
     */
    public static final int ACTIVO_REALIZABLE_PAPELERIA = 122;
    /**
     * Rubro: Activo realizable gasto pagado por anticipado
     */
    public static final int ACTIVO_REALIZABLE_GASTO_PAGADOxANTICIPADO = 123;
    /**
     * Rubro: Activo realizable edificio
     */
    public static final int ACTIVO_REALIZABLE_EDIFICIO = 124;
    /**
     * Rubro: Activo realizable diferido
     */
    public static final int ACTIVO_REALIZABLE_DIFERIDO = 125;
    /**
     * Rubro: Contra-activo
     */
    public static final int ACTIVO_CONTRAACTIVO = 130;
    /**
     * Rubro: Activo no circulante tangible
     */
    public static final int ACTIVO_noCIRCULANTE_TANGIBLE = 140;
    /**
     * Rubro: Activo no circulante tangible edificios
     */
    public static final int ACTIVO_noCIRCULANTE_TANGIBLE_EDIFICIO = 141;
    /**
     * Rubro: Activo no circulante tangible mobiliario
     */
    public static final int ACTIVO_noCIRCULANTE_TANGIBLE_MOBILIARIO = 142;
    /**
     * Rubro: Activo no circulante intangible
     */
    public static final int ACTIVO_noCIRCULANTE_INTANGIBLE = 150;
    /**
     * Rubro: Pasivo
     */
    public static final int PASIVO = 200;
    /**
     * Rubro: Pasivo circulante
     */
    public static final int PASIVO_CIRCULANTE = 210;
    /**
     * Rubro: Pasivo circulante no devengado
     */
    public static final int PASIVO_CIRCULANTE_noDEVENGADO = 211;
    /**
     * Rubro: Pasivo no circulante
     */
    public static final int PASIVO_noCIRCULANTE = 220;
    /**
     * Rubro: Pasivo diferido
     */
    public static final int PASIVO_DIFERIDO = 230;
    /**
     * Rubro: Capital
     */
    public static final int CAPITAL = 300;
    /**
     * Rubro: Capital ganado
     */
    public static final int CAPITAL_GANADO = 310;
    /**
     * Rubro: Capital ganado ingreso
     */
    public static final int CAPITAL_GANADO_INGRESO = 311;
    /**
     * Rubro: Capital ganado egreso
     */
    public static final int CAPITAL_GANADO_EGRESO = 312;

    /**
     * Obtener el código de la cuenta
     *
     * @return El código de la cuenta
     */
    public String getCodigo() {
        return codigo;
    }

    /**
     * Establecer el código de la cuenta
     *
     * @param codigo El código de la cuenta con el formato "###-###-###-###"
     */
    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    /**
     * Obtener el saldo deudor de la cuenta
     *
     * @return El saldo deudor
     */
    public double getDebe() {
        return debe;
    }

    /**
     * Cargar el saldo deudor de la cuenta
     *
     * @param valor El valor con que se cargara
     */
    public void cargar(double valor) {
        this.debe += (double) Math.round(valor * 100) / 100;
    }

    /**
     * Obtener el saldo acreedor de la cuenta
     *
     * @return el saldo acreedor
     */
    public double getHaber() {
        return haber;
    }

    /**
     * Abonar el saldo acreedor de la cuenta
     *
     * @valor haber el valor con que se cargara
     */
    public void abonar(double valor) {
        this.haber += (double) Math.round(valor * 100) / 100;
    }

    /**
     * Obtener el nombre de la cuenta
     *
     * @return El nombre de la cuenta
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * Establecer el nombre de la cuenta
     *
     * @param nombre El nombre de la cuenta
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * Obtener el rubro de la cuenta
     *
     * @return El rubro de la cuenta
     */
    public int getRubro() {
        return rubro;
    }

    /**
     * Establecer el rubro de la cuenta
     *
     * @param rubro El rubro contable
     */
    public void setRubro(int rubro) {
        this.rubro = rubro;
    }

    public void saldar() {
        if (rubro == ACTIVO_CONTRAACTIVO || rubro == CAPITAL_GANADO_EGRESO) {
            haber = (double) Math.round((haber - debe) * 100) / 100;
            debe = 0;
        } else if (rubro >= ACTIVO || rubro <= ACTIVO_noCIRCULANTE_INTANGIBLE) {
            debe = (double) Math.round((debe - haber) * 100) / 100;
            haber = 0;
        } else {
            haber = (double) Math.round((haber - debe) * 100) / 100;
            debe = 0;
        }
    }

    @Override
    public String toString() {
        String cuenta = "\nCódigo: " + codigo + "\nNombre de la cuenta: " + nombre + "\nSaldo deudor: $" + debe + "\nSaldo acreedor: $" + haber + "\nRubro: ";
        switch (rubro) {
            case ACTIVO:
                cuenta += "Activo";
                break;
            case ACTIVO_DISPONIBLE:
                cuenta += "Activo disponible";
                break;
            case ACTIVO_REALIZABLE:
                cuenta += "Activo realizable";
                break;
            case ACTIVO_REALIZABLE_INVENTARIO:
                cuenta += "Activo realizable inventario";
                break;
            case ACTIVO_REALIZABLE_PAPELERIA:
                cuenta += "Activo realizable papeleria";
                break;
            case ACTIVO_REALIZABLE_GASTO_PAGADOxANTICIPADO:
                cuenta += "Activo realizable gasto pagado x anticipado";
                break;
            case ACTIVO_REALIZABLE_EDIFICIO:
                cuenta += "Activo realizable edificio";
                break;
            case ACTIVO_REALIZABLE_DIFERIDO:
                cuenta += "Activo realizable diferido";
                break;
            case ACTIVO_CONTRAACTIVO:
                cuenta += "Contraactivo";
                break;
            case ACTIVO_noCIRCULANTE_TANGIBLE:
                cuenta += "Activo no circulante tangible";
                break;
            case ACTIVO_noCIRCULANTE_TANGIBLE_EDIFICIO:
                cuenta += "Activo no circulante tangible edificio";
                break;
            case ACTIVO_noCIRCULANTE_TANGIBLE_MOBILIARIO:
                cuenta += "Activo no circulante tangible mobiliario";
                break;
            case ACTIVO_noCIRCULANTE_INTANGIBLE:
                cuenta += "Activo no circulante intangible";
                break;
            case PASIVO:
                cuenta += "Pasivo";
                break;
            case PASIVO_CIRCULANTE:
                cuenta += "Pasivo circulante";
                break;
            case PASIVO_CIRCULANTE_noDEVENGADO:
                cuenta += "Pasivo circulante no devengado";
                break;
            case PASIVO_noCIRCULANTE:
                cuenta += "Pasivo no circulante";
                break;
            case PASIVO_DIFERIDO:
                cuenta += "Pasivo diferido";
                break;
            case CAPITAL:
                cuenta += "Capital";
                break;
            case CAPITAL_GANADO:
                cuenta += "Capital ganado";
                break;
            case CAPITAL_GANADO_INGRESO:
                cuenta += "Capital ganado ingreso";
                break;
            case CAPITAL_GANADO_EGRESO:
                cuenta += "Capital ganado egreso";
                break;
            default:
                cuenta += "Sin definir";
        }
        return cuenta;
    }
}
